package com.hysoft.pdr.main.service.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hysoft.pdr.entity.po.Demo;
import com.hysoft.pdr.main.service.mapper.DemoMapper;
import com.hysoft.pdr.main.service.service.IDemoService;
import com.hysoft.pdr.main.service.vo.DemoView;
import com.hysoft.web.service.impl.BaseService;
import org.springframework.stereotype.Service;

import java.util.Map;

@Service
public class DemoService extends BaseService<DemoMapper, Demo> implements IDemoService {
    /**
     * <h2>保存前的校验方法</h2>
     * <p>如果校验成功返回true，失败返回false</p>
     * <p>当返回false的时候，则不进行数据库的保存</p>
     * @param entity 保存前的对象
     * @return 是否校验成功
     */
    @Override
    public boolean beforeSave(Demo entity) {
        /*
        至于这个方法在实际业务中有什么用呢，比如说
        现在有一个需求，传过来的实体类进行数据库保存
        然后实体类里面有一个字段，是电压等级volLevel
        然后我们的需求是当电压等级为('001', '002')时（这两个值只是举例）
        我们就可以在这里进行校验了

        代码为

            return "001".equals(entity.getVolLevel()) ||
            "002".equals(entity.getVolLevel());

         */
        return true;
    }

    /**
     * <h2>保存后的回调函数</h2>
     * @param entity 保存后的对象
     */
    @Override
    public void afterSave(Demo entity) {
        /*
        这个方法时被调用时，entity已经被插入数据库中
        此方法为插入数据库后想要进行的下一步操作，则在这里面写
        比如插入了
        比如这个service本身表示的是人员表，我插入成功后
        需要将该人员赋权限
        （权限理解为另一张表，那么这张表也有对应的service和mapper还有实体类等）
        默认赋【普通成员】
        那么在该service中注入权限的service
        在该方法中调用权限service.insertOrUpdate方法即可
         */
    }

    @Override
    public boolean beforeDelete(Demo id) {
        /*
        删除前的校验方法，同保存，不再解释
         */
        return true;
    }

    @Override
    public void afterDelete(Demo id) {
        /*
        删除后的回调函数，同上，不再解释
         */
    }

    /**
     * <h2>单表查询扩张方法</h2>
     * <p>返回Object表示不限制返回类型，可以根据传入的实体类对VO进行扩展，最后返回VO类</p>
     * @param entity 根据主键id查询出来的结果
     * @return 扩展后的结果
     */
    @Override
    public Object extensionOne(Demo entity) {
        /*
        比如我现在根据主键id查询出来的Demo实体类结果
        但是Demo里面只有三个字段，id，name和age
        我现在返回给前端的时候想根据age来判断返回一个字符串，来表示人物年龄大小
        如0-18岁返回小孩
        18-200返回大人
        200岁以上返回妖怪
        代码为
        新建VO类，字段为id，name，age和des，当然也可以不建VO类，直接返回Map也可以
        然后就是VO vo = new Vo()
        vo.setId,setName,setAge分别调用一下传入实体类的值
        最后if判断
        if 0 < entity.getAge() < 18
            vo.setDes("小孩")
        else if age < 200
            vo.setDes("大人")
        else
            vo.setDes(妖怪)
        return vo
        这样就对单表查询结果进行了扩展
        如果不想扩展，实体类的字段已经够用了，则
            return null
        即可
         */
        return null;
    }

    /**
     * <h2>表格查询</h2>
     * @param page 分页对象
     * @param params 查询参数
     * @return 表格查询结果集
     */
    @Override
    public IPage<?> queryMapper(Page<Object> page, Map<String, Object> params) {
        // 首先调用mapper方法去查询sql
        IPage<DemoView> res = this.baseMapper.query(page, params);
        // 这边展示的是返回vo类
        // 然后DemoView里面还有个desc的描述，和之前根据id查询实体类再进行扩展是一样的
        // 如果实际业务中也有这样的需求，就可以把公共逻辑提出来（即根据age来判断des）
        res.getRecords().forEach(demoView -> {
            demoView.setDes(getDesByAge(demoView.getAge()));
        });
        // 至此，对sql查询结果集的扩展也能够在该方法中完成，然后renturn出去即可
        return res;
    }

    private String getDesByAge(int age) {
        if (age >= 0 && age <= 18) {
            return "小孩";
        } else if (age <= 200) {
            return "大人";
        } else {
            return "妖怪";
        }
    }
}
